﻿using System.Erp.Runtime;

namespace System.Erp
{
    /// <summary>
    /// 标记到一个类上，用于指明此类实现的服务接口。
    /// </summary>
    /// <remarks>
    /// <para>允许标记多个此实例到同一个类上，表示此服务类实现了多个服务接口。</para>
    /// <para>如果要自定义此服务在容器中的创建和释放（即生命周期管理），可以在此类上标记<see cref="CreatorAttribute"/>来实现。</para>
    /// </remarks>
    public sealed class ServiceAttribute : PartProviderAttribute
    {
        /// <summary>
        /// 指定实现的接口来实例化ServiceAttribute
        /// </summary>
        /// <param name="interfaceType">表明此服务类实现的接口</param>
        public ServiceAttribute(Type interfaceType)
        {
            #region 参数检查
            if (interfaceType == null)
            {
                throw new ArgumentNullException("interfaceType");
            }
	        #endregion

            this._interfaceType = interfaceType;
        }

        private readonly Type _interfaceType;
        /// <summary>
        /// 返回此服务类实现的接口
        /// </summary>
        public Type InterfaceType
        {
            get { return this._interfaceType; }
        }

        /// <summary>
        /// 返回此Attribute能够提供的零件
        /// </summary>
        /// <param name="reflectedSource">此Attribute引用的源</param>
        /// <returns>零件对象</returns>
        public override IPart CreatePart(AttributeReflectedSource reflectedSource)
        {
            return new ServicePart(reflectedSource.Workspace, _interfaceType, reflectedSource.Type,reflectedSource.CreatorAttribute);
        }
    }
}
